package OOA.com.JavaBasis.outinerclass;


/*
* 匿名内部类
* 格式：（注意结尾要有;)
*    第一种格式：（推荐这么写）
*    接口类型  对象名称 = new 接口类型（）{
*                  //实现当前接口中的抽象方法
*                 };
*     如果想要调用重写的方法，只需要用 对象名.方法名（）去调用
*
*    第二种格式：（不推荐，这个方式叫匿名对象）
*     new 接口类型（）{
*                  //实现当前接口中的抽象方法
*                 };
*    如果需要调用重写方法，则要在最后打点调，且只能调用一次，如  new 接口类型（）{//实现当前接口中的抽象方法}. 方法名（）;
*
*
* 说明：
* 1.new是一个创建对象的动作：【创建一个实现类对象，且该实现类是没有名字的】
* 2.接口类型就是匿名内部类要去实现的那个接口
* 3.{//实现当前接口中的抽象方法}这是匿名内部类要执行的内容
*
* 注意：
* 1.匿名内部类在创建完对象后，只能使用唯一的一次
* 2.匿名对象的方式不推荐使用，因为调用方法它只能调用一次
*
* 什么时候使用匿名内部类？
* 当实现类值需要使用一次的时候，就优先考虑匿名内部类的方式，这样就不用重新另外的创建一个实现类了
*
* */
public class InterfaceDemo {
    public static void main(String[] args) {
        
        Interface i = new Interface() {
            @Override
            public void show() {
                System.out.println("匿名内部类：这是重写的show");
            }

            @Override
            public void method() {
                System.out.println("匿名内部类：这是重写的method");
            }
        };
        i.method();
        i.show();

        //匿名对象的方式
        new Interface(){

            @Override
            public void show() {
                System.out.println("匿名内部类之匿名对象：这是重写的show");
            }

            @Override
            public void method() {
                System.out.println("匿名内部类之匿名对象：这是重写的method");
            }
        }.show();

        new Interface(){

            @Override
            public void show() {
                System.out.println("匿名内部类之匿名对象：这是重写的show");
            }

            @Override
            public void method() {
                System.out.println("匿名内部类之匿名对象：这是重写的method");
            }
        }.method();
    }
}
